<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<!--
作用域插槽：
    在某些场景下 插槽的内容 可能想要 同时使用 父组件域内和子组件域内 的数据

这里可以理解为：同一份数据有不同的展现方式

具体的实现如下：
    1. 在子组件的 slot 插槽位置增加绑定属性 :data
    2. 在自定义标签的地方增加需要显示的代码
-->

<div id="app">
    <lk-box></lk-box>

    <!--  作用域插槽具体实现  -->
    <lk-box>
        <!--  这里的 default 具名插槽的意思，slotProps 这是对应于 插槽中的 data 数据， 另外需要使用 template 标签   -->
        <!--  这里就是将下面的  :data="nameArray" 传入  slotProps 中来-->
        <template v-slot:default="slotProps">
            <p>{{slotProps}}</p>
            <p>{{slotProps.data}}</p>
            <ul>
                <li v-for="name in slotProps.data">{{name}}</li>
            </ul>
        </template>
    </lk-box>
</div>

<template id="box">
    <div style="width: 500px; height: 300px; background-color: #846f74; border-radius: 4px; margin-top: 20px">
        <slot :data="nameArray">
            <!--      默认的显示内容      -->
            <ul>
                <li v-for="name in nameArray">{{name}}</li>
            </ul>
        </slot>
    </div>
</template>

</body>
<script src="js/vue.js"></script>
<script>

    const lkBox = {
        data() {
            return {
                nameArray: ["Tim", "Tom", "Jim", "Ben", "Bob"]
            };
        },
        template: `#box`,   // 这里必须要使用 `` 符号作为字符串
        methods: {
            btnCallback() {
                console.log("box 中 button 调用");
            }
        }
    };

    const app = Vue.createApp({
        data() {
            return {
            }
        },
        components: {
            "lk-box": lkBox
        }
    }).mount("#app");
</script>
</html>
